/*                          UX-Framework                               
 *                                                                 
 *  iZE Co.,Ltd. Copyright 2009 All rights reserved.          
 *  This file is distributed under the terms of the GNU Lesser 
 *  General Public License, described in file LICENSE.                                     
 */
package jp.ize.ux.components;

// {{{ imports
import jp.ize.ux.UXObject;
import jp.ize.ux.UXPoint;	

import jp.ize.ux.UXResource;
import jp.ize.ux.UXController;
import jp.ize.ux.UXInteraction;
import jp.ize.ux.states.UXBasicState;
import jp.ize.ux.components.UXTextAttribute;
import jp.ize.ux.components.UXButton;
import jp.ize.ux.UXFocusManager;
import jp.ize.ux.components.UXComponent;
import jp.ize.ux.acts.Act;

#if flash9
import flash.text.TextField;
#elseif flash
import flash.TextField;
#end
// }}}

// {{{ class UXMenuResource extends UXComponentResource
/**
 * UXMenuResource クラス<br>
 * UXMenuコンポーネントに利用されるリソース群です。
 */
class UXMenuResource extends UXComponentResource
{
	// {{{ public var background(default, default) : UXObject
	/**
	 * 背景となるオブジェクトです。
	 */
	public var background(default, default) : UXObject;
	// }}}
	// {{{ public var separator(default, default) : UXObject
	/**
	 * セパレータの表示を決定するオブジェクトです。
	 */
	public var separator(default, default) : UXObject;
	// }}}
	// {{{ public var submenuArrow(default, default) : UXObject;
	/**
	 * 子項目にサブメニューがあるときに表示する三角矢印です。
	 */
	public var submenuArrow(default, default) : UXObject;
	// }}}
	// {{{ public var check( default, default ) : UXResource;
	/**
	 * チェックされた時に利用されるリソースを示します。
	 */
	public var check( default, default ) : UXResource;
	// }}}
	// {{{ public var uncheck( default, default ) : UXResource;
	/**
	 * チェックが外された時に利用されるリソースを示します。
	 */
	public var uncheck( default, default ) : UXResource;
	// }}}
	// {{{ public var focusManager(default, default) : UXFocusManager
	/**
	 * このコンポーネントが属するフォーカスグループの管理オブジェクトです。
	 * このコンポーネントがフォーカスを受け取らない場合はnullです。
	 */
	public var focusManager(default, default) : UXFocusManager;
	// }}}
}
// }}}
// {{{ class UXMenuAct extends ActSubject<UXMenuState>
/**
 * UXMenuAct クラス<br>
 * UXMenuのアクションです。
 */
class UXMenuAct extends ActSubject<UXMenuState>
{
	// {{{ public function show( s : UXMenuState ) : Void
	/**
	 * 表示状態になった時のデフォルトアクションです。
	 */
	public function show( s : UXMenuState ) : Void
	{
	}
	// }}}
	// {{{ public function hide( s : UXMenuState ) : Void
	/**
	 * 非表示状態になった時のデフォルトアクションです。
	 */
	public function hide( s : UXMenuState ) : Void
	{
	}
	// }}}
}
// }}}
// {{{ class UXMenuState extends UXBasicState
/**
 * UXMenuState クラス<br>
 * UXMenuの現在の状態を表すオブジェクトです。
 */
class UXMenuState extends UXBasicState
{
	// {{{ public var menuResource( default, default ) : UXMenuResource;
	/**
	 * メニューを表示するためのリソースです。
	 */
	public var menuResource( default, default ) : UXMenuResource;
	// }}}
	// {{{ public var menuItems( default, null ) : Array<MenuItem>;
	/**
	 * メニュー項目の配列です。デフォルトでは空配列です。
	 */
	public var menuItems( default, null ) : Array<MenuItem>;
	// }}}	
	// {{{ public var parentMenu( default, null ) : UXMenu
	/**
	 * このメニューを子に持つ親メニューがあれば、それを返します。なければnullを返します。
	 */
	public var parentMenu( default, null ) : UXMenu;
	// }}}
	// {{{ public var highlightedItem( getSelectedItem, setSelectedItem ) : MenuItem;
	/**
	 * ハイライトされている項目を取得します。
	 */
	public var highlightedItem( getHighlightedItem, setHighlightedItem ) : MenuItem;
	// }}}
	// {{{ private function getHighlightedItem() : MenuItem
	/** 選択されている項目を取得します。 */
	private function getHighlightedItem() : MenuItem
	{
		return null;
	}

	// }}}
	// {{{ public function setHighlightedItem( i : MenuItem ) : MenuItem
	/**
	 *
	 */
	public function setHighlightedItem( i : MenuItem ) : MenuItem
	{
		return null;
	}
	// }}}
	// {{{ public function new()
	/**
	 * コンストラクタです。<br>
	 * このメニューがサブメニューである場合は親メニューの参照を引数として受け取ります。
	 */
	public function new( ?parent : UXMenu = null )
	{
		super();
		this.parentMenu = parent;
	}
	// }}}
}
// }}}
// {{{ class UXMenu extends UXComponent
/**
 * UXMenuクラス<br>
 * 
 *
 * @author		iZE Co., Ltd.<br>
 * @version		$Id$<br>
 */
class UXMenu extends UXComponent
{
	// {{{ properties

	private var _state : UXMenuState;

	// }}}
	// {{{ public var ctrl : UXController<UXMenuState>;
	/**
	 * このコンポーネント内でのインタラクションを管理するコントローラークラスのインスタンスです。
	 */
	public var ctrl : UXController<UXMenuState>;
	// }}}
	// {{{ public function new()
	/**
	 *
	 */
	public function new()
	{
		super();
	}
	// }}}
	// {{{ public function show( p : UXPoint ) : Void
	/**
	 * メニューの左上隅の座標が親からのローカル座標系でポイントpに位置するようにメニューを表示します。
	 * このメソッドはUXVisibilityInteractionを使ってメニューを表示します。
	 */
	public function show( p : UXPoint ) : Void
	{
	}
	// }}}
	// {{{ public function hide() : Void
	/**
	 * メニューを非表示にします。
	 * このメソッドはUXVisibilityInteractionを使ってメニューを非表示にします。
	 */
	public function hide() : Void
	{
	}
	// }}}
	// {{{ public function update( updator : UXMenuState -> Void ) : Void
	/**
	 * このコンポーネントの状態を直接変更するメソッドです。状態のどんな操作も可能になるので、
	 * このメソッドの使用には注意が必要です。
	 */
	public function update( updator : UXMenuState -> Void ) : Void
	{
		updator( _state );
	}
	// }}}
}
// }}}
// {{{ class UXMenuInitInteraction extends UXInteraction<UXMenuState>
/**
 * UXMenuInitInteraction クラス<br>
 * メニューの初期化インタラクションです。
 */
class UXMenuInitInteraction extends UXInteraction<UXMenuState>
{
}
// }}}
// {{{ class UXMenuVisibilityInteraction extends UXInteraction<UXMenuState>
/**
 * UXMenuVisibilityInteraction クラス<br>
 * メニューが表示された、または非表示にされたことを表すインタラクションです。
 */
class UXMenuVisibilityInteraction extends UXInteraction<UXMenuState>
{
}
// }}}
// {{{ enum MenuItem
enum MenuItem
{
	/** 文字列やアイコン画像を表示し、サブメニューへの展開ができる項目です。 */
	Item (i : UXMenuItem);
	/** 項目を区切るためのセパレーターです。 */
	Separator;
}
// }}}
// {{{ class UXMenuItemCoState
class UXMenuItemCoState
{
	// {{{ public var highlighted(default, default) : Bool
	/**
	 * このボタンがハイライトされているかどうかを取得、または設定します。
	 */
	public var highlighted(default, default) : Bool;
	// }}}
}
// }}}
// {{{ enum UXMenuItemExclusiveState
/**
 * UXMenuItemの各種状況を表現します。
 */
enum UXMenuItemExclusiveState
{
	/** 初期化状態にある事を意味します。*/
	INIT;
	/** 無効になっている事を意味します。*/
	DISABLE;
	/** 有効になっている事を意味します。パラメーターでは、フォーカスやハイライトの状況を保持します。*/
	ENABLE ( flags : UXMenuItemCoState );
}
// }}}
// {{{ class UXMenuItemState extends UXBasicState
/**
 * UXMenuItemState クラス<br>
 * UXMenuItemの現在の状態を表すオブジェクトです。
 */
class UXMenuItemState extends UXBasicState
{
	// {{{ public var condition( default, default) : UXMenuItemExclusiveState;
	/**
	 * enableかどうかやフォーカスが当たっているかなど各種状況を保持する変数です。
	 */
	public var condition( default, default) : UXMenuItemExclusiveState;
	// }}}
	// {{{ public var icon( default, default ) : UXImage;
	/**
	 * 画像を指定できます。デフォルトではnullです。
	 */
	public var icon( default, default ) : UXImage;
	// }}}
	// {{{ public var text( default, default ) : UXLabel;
	/**
	 * 文字列を指定できます。デフォルトでは空文字列です。
	 */
	public var text( default, default ) : UXLabel;
	// }}}
	// {{{ public var textAttribute(default, default) : UXTextAttribute
	/**
	 * テキストの表示状態を示します。
	 */
	public var textAttribute(default, default) : UXTextAttribute;
	// }}}
	// {{{ public var subMenu( default, default ) : UXMenu;
	/**
	 * このメニュー項目に関連するサブメニューを指定します。デフォルトはnullです。
	 */
	public var subMenu( default, default ) : UXMenu;
	// }}}
	// {{{ public var checkable( default, default ) : Bool;
	/**
	 * この項目にチェックを付けることが出来るかどうかを設定します。
	 */
	public var checkable( default, default ) : Bool;
	// }}}
	// {{{ public var isChecked( default, default ) : Bool;
	/**
	 * この項目にチェックマークが付いているかどうかを取得または設定します。
	 */
	public var isChecked( default, default ) : Bool;
	// }}}
	// {{{ public var isHighlighted( default, default ) : Bool;
	/**
	 * この項目が現在ハイライトされているかどうかを取得します。
	 */
	public var isHighlighted( default, null ) : Bool;
	// }}}
}
// }}}
// {{{ class UXMenuItem extends UXComponent
/**
 * UXMenuItem クラス<br>
 * UXMenuの項目クラスです。
 */
class UXMenuItem extends UXComponent
{
	// {{{ properties

	private var _state : UXMenuItemState;

	// }}}
	// {{{ public var ctrl : UXController<UXMenuItemState>;
	/**
	 * このコンポーネント内でのインタラクションを管理するコントローラークラスのインスタンスです。
	 */
	public var ctrl : UXController<UXMenuItemState>;
	// }}}
	// {{{ public function new()
	/**
	 * コンストラクタです。
	 */
	public function new()
	{
		super();
	}
	// }}}
	// {{{ public function update( updator : UXMenuItemState -> Void ) : Void
	/**
	 * このコンポーネントの状態を直接変更するメソッドです。状態のどんな操作も可能になるので、
	 * このメソッドの使用には注意が必要です。
	 */
	public function update( updator : UXMenuItemState -> Void ) : Void
	{
		updator( _state );
	}
	// }}}
}
// }}}
// {{{ class UXMenuItemInitInteraction extends UXInteraction<UXMenuState>
/**
 * UXMenuItemInitInteraction クラス<br>
 * メニュー項目の初期化インタラクションです。
 */
class UXMenuItemInitInteraction extends UXInteraction<UXMenuState>
{
}
// }}}
// {{{ class UXMenuItemHighlightInteraction extends UXInteraction<UXMenuItemState>
/**
 * UXMenuItemHighlightInteraction クラス<br>
 * メニュー項目のhighlight/delightに対するデフォルトインタラクションです。
 */
class UXMenuItemHighlightInteraction extends UXInteraction<UXMenuItemState>
{
}
// }}}
// {{{ class UXMenuItemEnableInteraction extends UXInteraction<UXMenuItemState>
/**
 * UXMenuItemEnableInteraction クラス<br>
 * メニュー項目のenable/disableに対するデフォルトインタラクションです。
 */
class UXMenuItemEnableInteraction extends UXInteraction<UXMenuItemState>
{
}
// }}}
// {{{ class UXMenuItemDecideInteraction extends UXInteraction<UXMenuItemState>
/**
 * UXMenuItemDicideInteraction クラス<br>
 * メニュー項目の決定に対するデフォルトインタラクションです。
 */
class UXMenuItemDecideInteraction extends UXInteraction<UXMenuItemState>
{
}
// }}}
